package net.zjitc.securityloginapijwt.utils;

import cn.hutool.json.JSONUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import net.zjitc.securityloginapijwt.pojo.TUser;

import java.util.HashMap;
import java.util.Map;

public class JWTUtil {
    public static final String secret = "0S/12dSd0=;2Sfdjkh30PYs";

    public static void main(String[] args) {
        TUser tUser = new TUser();
        tUser.setId(10282);
        tUser.setLoginAct("cat");
        tUser.setEmail("cat@163.com");
        String userJson = JSONUtil.toJsonStr(tUser);

//生成jwt字符串
        String token = createToken(userJson);
        System.out.println(token);
        Boolean verify = verifyToken(token);
        System.out.println(verify);
        parseToken(token);
    }
    public static String createToken(String userJson){
        //组装头数据
        Map<String, Object> header = new HashMap<>();
        header.put("alg", "HS256");
        header.put("typ", "JWT");

        return JWT.create()
                //头
                .withHeader(header)
                //自定义数据
                .withClaim("user", userJson)
                .withClaim("phone","111111")
                .withClaim("email","111111@")
                //签名算法
                .sign(Algorithm.HMAC256(secret));
    }
    //2、怎么验证jwt有没有被篡改？
    public static Boolean verifyToken(String token) {
        try {
            // 使用密钥创建一个jwt验证对象
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build();
            //使用验证器对象验证JWT，如果验证没有抛出异常，说明验证通过，反之就是没有通过
            jwtVerifier.verify(token);
            //如果验证没有抛出异常，返回true表示验证通过
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    public static String parseToken(String token) {
        try {
            // 使用秘钥创建一个jwt验证器对象
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build();
            //验证JWT，得到一个解码后的jwt对象
            DecodedJWT decodedJWT = jwtVerifier.verify(token);

            //通过解码后的jwt对象获取负载的数据
            Claim user = decodedJWT.getClaim("user");
            System.out.println(user.asString());

            Claim phone = decodedJWT.getClaim("phone");
            System.out.println(phone.asString());

            Claim email = decodedJWT.getClaim("email");
            System.out.println(email.asString());

            return user.asString();
        } catch (TokenExpiredException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
